package valid

import (
	"context"
)

// Validatable is the interface indicating the type implementing it supports data validation.
type Validatable interface {
	// Validate validates the data and returns an error if validation fails.
	Validate() error
}

// ValidatableWithContext is the interface indicating the type implementing it supports context-aware data validation.
type ValidatableWithContext interface {
	// ValidateWithContext validates the data with the given context and returns an error if validation fails.
	ValidateWithContext(ctx context.Context) error
}

// Rule represents a validation rule.
type Rule interface {
	// Validate validates a value and returns a value if validation fails.
	Validate(value interface{}) error
}

// RuleWithContext represents a context-aware validation rule.
type RuleWithContext interface {
	// ValidateWithContext validates a value and returns a value if validation fails.
	ValidateWithContext(ctx context.Context, value interface{}) error
}
